<?php

/**
 * 备忘录模式（撤销功能的实现）
 * 
 * 概述：在不破坏封装的前提下，捕获一个对象的内部状态，并在该对象之外保存这个状态，
 * 这样可以在以后将对象恢复到原先保存的状态。
 * 
 * 类型：行为类模式
 * 
 * 角色：
 *  1，原发器。需要被保存的类。
 *  2，备忘录。保存的类。
 *  3，负责人。管理备忘录。
 *  
 * 优点：
 * 
 * 缺点：
 * 
 */

/**
 * 原发器
 */
class Originator
{
	private $_state;
	
	public function setState($state)
	{
		$this->_state = $state;
	}
	
	public function getState()
	{
		return $this->_state;
	}
	
	public function createMemento()
	{
		return new Memento($this);
	}
	
	public function restoreMemento(Memento $memento)
	{
		$this->_state = $memento->getState();
	}
}

/**
 * 备忘录
 */
class Memento
{
	private $_state;
	
	public function __construct(Originator $orig)
	{
		$this->_state = $orig->getState();
	}
	
	public function setState($state)
	{
		$this->_state = $state;
	}
	
	public function getState()
	{
		return $this->_state;
	}
}

/**
 * 负责人
 */
class Caretaker
{
	private $_memento;
	
	public function setMemento(Memento $memento)
	{
		$this->_memento = $memento;
	}
	
	public function getMemento()
	{
		return $this->_memento;
	}
}

class Client
{
	public static function main()
	{
		//管理备忘录
		$caretaker = new Caretaker();
		
		//要保存的对象
        $org = new Originator();
        $org->setState('open');
 
        /* 创建备忘 */
        $memento = $org->createMemento();
        $caretaker->setMemento($memento);
 
        /* 改变目标对象的状态 */
        $org->setState('close');
 
        /* 还原操作 */
        $org->restoreMemento($caretaker->getMemento());
        
        var_dump($org);
	}
}

Client::main();